﻿using System;
using Antlr.Runtime;
using Antlr.Runtime.Tree;
using Antlr.Runtime.Misc;
using Antlr3.ST.Language;
using Antlr3.ST.Extensions;
using Antlr4.StringTemplate;
using System.Collections.Generic;

namespace LPlusPlus
{
    class main
    {
        static void Main(string[] args)
        {
            ANTLRFileStream input = new ANTLRFileStream("prueba.lpp");
            LPPLexer lexer = new LPPLexer(input);

            CommonTokenStream tokens = new CommonTokenStream(lexer);
            LPPParser parser = new LPPParser(tokens);

            AstParserRuleReturnScope<CommonTree, CommonToken> aux = parser.programa();

            if (lexer.numErrors == 0 && parser.numErrors == 0)
            {
                /*CommonTree tree = aux.Tree;
                DotTreeGenerator gen = new DotTreeGenerator();
                string dotfile = gen.ToDot(tree);
                System.IO.File.WriteAllText(@"C:\Users\Walter\Desktop\WriteText.dot", dotfile);*/
                Console.WriteLine("Tabla de simbolos: ");
                foreach (string k in parser.tablaSimbolos.symTable.Keys)
                {
                    foreach (Symbol s in parser.tablaSimbolos.symTable[k])
                    {
                        if(s.tipo == "clase")
                            Console.WriteLine(s.nro + "- Clase: " + s.modificador + " " + k);
                        if (s.tipo != "clase" && s.tipo != "metodo" && s.tipo != "principal")
                            if(s.metodo != null)
                                Console.WriteLine(s.nro + "- Variable " + s.modificador + " " + k + " tipo: " + s.tipo + ", clase: " + s.clase + ", metodo: " + s.metodo);
                            else
                                Console.WriteLine(s.nro + "- Variable " + s.modificador + " " + k + " tipo: " + s.tipo + ", clase: " + s.clase);
                        if (s.tipo == "metodo")
                            Console.WriteLine(s.nro + "- Metodo " + s.modificador + " " + k + " retorna " + s.tipoRetorno + ", nroParametros: " + s.numParametros + ", clase: " + s.clase);
                        if (s.tipo == "principal")
                            Console.WriteLine(s.nro + "- Metodo Principal " + k + ", clase: " + s.clase);
                        if (s.tipo == "constructor")
                            Console.WriteLine(s.nro + "- Constructor " + s.modificador + " " + k + ", nroParametros: " + s.numParametros + ", clase: " + s.clase);
                    }
                }
            }

            if (lexer.numErrors != 0)
                Console.WriteLine("Errores encontrados en el analisis Lexico: " + lexer.numErrors);
            if (parser.numErrors != 0)
                Console.WriteLine("Errores encontrados en el analisis Sintactico: " + parser.numErrors);

            Console.ReadLine();
        }

    }
}
